/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package GUI;




import Entities.SACH;
import Entities.THELOAI;
import Entities.TACGIA;
import java.awt.HeadlessException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.util.Callback;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;

/**
 * FXML Controller class
 *
 * @author lainh_000
 */
public class FX_SachController implements Initializable {

    /**
     * Initializes the controller class.
     */
    
    
    @FXML
    TableView<SACH> table_Sach;
    @FXML
    TableColumn<SACH, String> Col_masach;
    @FXML
    TableColumn<SACH, String> Col_tensach;
    @FXML
    TableColumn<SACH, String> Col_theloai;
    @FXML
    TableColumn<SACH, String> Col_tacgia;
    @FXML
    TableColumn<SACH, String> Col_dongiaban;
    @FXML
    TableColumn<SACH, String> Col_soluong;
    @FXML
    ListView list_theloai;
    @FXML
    ListView list_tacgia;
    @FXML
    TextField txtMaSach;
    @FXML
    TextField txtTenSach;
    @FXML
    TextField txtSoLuong;
    @FXML
    TextField txtDonGia;
    @FXML
    TextField txtTheLoai;
    @FXML
    TextField txtTacGia;
    @FXML
    ImageView BookImage;
    
    @FXML Button btnThem;
    @FXML Button btnXoa;
    @FXML Button btnSua;
    @FXML Button btnTimKiem;
    @FXML Button btnFile_Browser;
    
    // Khởi tạo các model cho việc truy xuất dữ liệu
    SACH sach_model = new SACH();
    THELOAI theloai_model = new THELOAI();
    TACGIA tacgia_model = new TACGIA();
    
    // Các biến dữ liệu dùng cho việc inser, update , delete
    String masachText,tensachText,tacgiaText,theloaiText,dongiabanText,soluongText,urlHinh,urlHinhSelected;
    String temp=null;
    int ComboBox_MaTg_Selected,ComboBox_MaTl_Selected=0;
    // Khởi tạo biến file upload
    File file;
    // Khởi tạo URL mặc định nếu không có hình trong database
    Image image = new Image("Image/addressbook_add_256.png");
    // Biến cờ, xác định xem user có upload hình mới hay không
    int file_browser_flag=0;
    
    
    InputStream inStream = null;
    OutputStream outStream = null;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
        assert table_Sach != null;
        assert list_theloai !=null;
        assert list_tacgia !=null;
        assert btnThem !=null;
        assert btnXoa !=null;
        assert btnSua !=null;
        assert btnTimKiem !=null;
        assert btnFile_Browser !=null;
        assert BookImage !=null;
        assert txtTacGia !=null;
        assert txtTheLoai !=null;
        assert txtSoLuong !=null;
        assert txtDonGia !=null;
        assert txtMaSach !=null;
        assert txtTenSach !=null;
                
        
        
        // Khởi tạo cách hiển thị dữ liệu trên table và list
        InitComboBox();
        
        // Thực hiện query add data lên table
        LoadDataTable();
        
        // Thực hiện query add data lên list thể loại
        LoadDataList_theloai();

        // Thực hiện query add data lên list tác giả
        LoadDataList_tacgia();

    }    
    
        public void InitComboBox()
    {
        // Định nghĩa dữ liệu của từng cột trong table
        Col_masach.setCellValueFactory(new PropertyValueFactory<SACH, String>("masach"));
        Col_tensach.setCellValueFactory(new PropertyValueFactory<SACH, String>("tensach"));
        Col_theloai.setCellValueFactory(new PropertyValueFactory<SACH, String>("theloai"));
        Col_tacgia.setCellValueFactory(new PropertyValueFactory<SACH, String>("tacgia"));
        Col_dongiaban.setCellValueFactory(new PropertyValueFactory<SACH, String>("dongiaban"));
        Col_soluong.setCellValueFactory(new PropertyValueFactory<SACH, String>("soluong"));
        
            
        // Định nghĩa dữ liệu được load lên list (tên thể loại)
        list_theloai.setCellFactory(new Callback<ListView<THELOAI>, ListCell<THELOAI>>(){
 
            @Override
            public ListCell<THELOAI> call(ListView<THELOAI> p) {       
                ListCell<THELOAI> cell = new ListCell<THELOAI>(){
                    @Override
                    protected void updateItem(THELOAI t, boolean bln) {
                        super.updateItem(t, bln);
                        if (t != null) {
                            // SetText cho list là Tên thể loại
                            setText(t.getMatl() +"-" +t.getTentl());
                        }
                    }
                };
                return cell;
            }
        });
        
        // Định nghĩa dữ liệu được load lên list (tên tác giả)
        list_tacgia.setCellFactory(new Callback<ListView<TACGIA>, ListCell<TACGIA>>(){
 
            @Override
            public ListCell<TACGIA> call(ListView<TACGIA> p) {       
                ListCell<TACGIA> cell = new ListCell<TACGIA>(){
                    @Override
                    protected void updateItem(TACGIA t, boolean bln) {
                        super.updateItem(t, bln);
                        if (t != null) {
                            // SetText cho list là Tên tác giả
                            setText(t.getMatg() + "-" +t.getTentg());
                        }
                    }
                };
                return cell;
            }
        });
        
        // Code xử lý khi select 1 item trong list The Loai
        list_theloai.getSelectionModel().selectedItemProperty().addListener(
            new ChangeListener<THELOAI>() {
                public void changed(ObservableValue<? extends THELOAI> ov, 
                    THELOAI old_val, THELOAI new_val) {
                    
                        //Set the label with the selected item
                        txtTheLoai.setText(String.valueOf(new_val.getMatl()));
                        //ComboBox_MaTl_Selected = new_val.getMatl();
            }
        });
        
        // Code xử lý khi select 1 item trong list Tac Gia
        list_tacgia.getSelectionModel().selectedItemProperty().addListener(
            new ChangeListener<TACGIA>() {
                public void changed(ObservableValue<? extends TACGIA> ov, 
                    TACGIA old_val, TACGIA new_val) {
                    
                        //Set the label with the selected item
                        txtTacGia.setText(String.valueOf(new_val.getMatg()));
                        //ComboBox_MaTg_Selected = new_val.getMatg();
            }
        });
        
        
        btnFile_Browser.setOnAction(
            new EventHandler<ActionEvent>() {
                @Override
                public void handle(final ActionEvent e) { 
                    // Upload hình vào thư mục chứa của solution
                    Upload_Image();         
            }
        });
}

   public void Upload_Image()
   {
       FileChooser fileChooser = new FileChooser();
                    //Set extension filter
                    FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
                    FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
                    fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);
                    //Show open file dialog
                    try{
                        // Mở dialog open file hình
                        file = fileChooser.showOpenDialog(null);
                        // Lấy tên file của file được chọn
                        temp = file.getName();
                        // Lấy đường dẫn thư mục của project (sgu-book-store)
                        String path = new java.io.File(".").getCanonicalPath();
                        // Tạo đường dẫn và tên hình mới đến chỗ cần copy
                        File newFile = new File(path + "/src/Image/" + temp);
                        
                        // Đoạn code copy file mới
                        inStream = new FileInputStream(file);
                        outStream = new FileOutputStream(newFile);
                        byte[] buffer = new byte[1024];
 
                        int length;
                        //copy the file content in bytes 
                        while ((length = inStream.read(buffer)) > 0){

                            outStream.write(buffer, 0, length);

                        }

                        inStream.close();
                        outStream.close();
                        
                        // Từ file hình mới, hiển thị lên form
                        BufferedImage bufferedImage = ImageIO.read(newFile);
                        Image imageUpload = SwingFXUtils.toFXImage(bufferedImage, null);
                        BookImage.setImage(imageUpload);
                        // Gán biến flag = 1 để biết là đã có hình mới được up lên
                        file_browser_flag=1;
                    }
                    catch(IOException ex)
                    {
                        Logger.getLogger(FX_SachController.class.getName()).log(Level.SEVERE, null, ex);
                        String stb="Không lấy được dữ liệu Sách";
                        JOptionPane.showMessageDialog(null,stb);
                    }
   }

  

    protected void LoadDataTable()
        {
        sach_model.getSach_All();

        // Gán data
        table_Sach.setItems(SACH.data);
        
        // Gán command khi user click vào 1 item trong table
        table_Sach.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
        
        table_Sach.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() 
        { 
            @Override
            public void changed(ObservableValue observable, Object oldValue, Object newValue) 
            { 
                SACH sach = (SACH)newValue;
                txtMaSach.setText(String.valueOf(sach.getMasach()));
                txtTenSach.setText(sach.getTensach());
                txtSoLuong.setText(String.valueOf(sach.getSoluong()));
                txtDonGia.setText(String.valueOf(sach.getDongiaban()));
  
                try
                {
                theloai_model.getTheLoai_By_Id(sach.getTheloai());
                txtTheLoai.setText(String.valueOf(THELOAI.theloai_selected.getMatl()));
                autoSelectTheLoai(THELOAI.theloai_selected.getTentl());
                    
                
                tacgia_model.getTacGia_By_Id(sach.getTacgia());
                txtTacGia.setText(String.valueOf(TACGIA.tacgia_selected.getMatg()));
                autoSelectTacGia(TACGIA.tacgia_selected.getTentg());
                }
                catch (Exception ex) {
                    String stb="Không lấy được dữ liệu";
                    JOptionPane.showMessageDialog(null,stb);
                }
                
                
                // Load image
                if(sach.getHinhanh()!=null)
                {
                image = new Image(sach.getHinhanh());    
                }
                
                BookImage.setImage(image);
                
                // Gán biến urlHinhSelected để giữ URL lại nếu user không upload hình mới
                urlHinhSelected = sach.getHinhanh();
            } 
        });
    }      
        
    // Select Tác giả ở List khi 1 row trong table được chọn    
    private void autoSelectTacGia(String tentg)
    {
        for (TACGIA tacgia : TACGIA.tacgia_items)
        {
            if (tacgia.getTentg().equals(tentg))
            {
                list_tacgia.getSelectionModel().select(tacgia);
            }
        }
    }
    // Select Thể loại ở List khi 1 row trong table được chọn
    private void autoSelectTheLoai(String tentl)
    {
        for (THELOAI theloai : THELOAI.theloai_items)
        {
            if (theloai.getTentl().equals(tentl))
            {
                list_theloai.getSelectionModel().select(theloai);
            }
        }
    }
   
    private void LoadDataList_theloai()
    {
        theloai_model.getTheLoai_All();
        // Gán data lên list
        list_theloai.setItems(THELOAI.theloai_items);
    }   
    
    private void LoadDataList_tacgia()
    {
        tacgia_model.getTacGia_All();
        // Gán data lên list
        list_tacgia.setItems(TACGIA.tacgia_items);
    }
    
    public void btn_addClick(ActionEvent event)
    {
        try {
            getText();
            
            sach_model.Insert_Sach(tensachText, ComboBox_MaTg_Selected, ComboBox_MaTl_Selected, urlHinh, dongiabanText, soluongText);
            
            JOptionPane.showMessageDialog(null,"Thêm thành công");
        } catch (HeadlessException ex) {
            String stb="Thêm dữ liệu không thành công.";
            JOptionPane.showMessageDialog(null,stb);       
        }    
    }
    
    public void btn_editClick(ActionEvent event)
    {
         try {
            getText();
            
            sach_model.Update_Sach(masachText, tensachText, ComboBox_MaTg_Selected, ComboBox_MaTl_Selected, urlHinh, dongiabanText, soluongText);
            
            JOptionPane.showMessageDialog(null,"Cập nhật thành công");
        } catch (HeadlessException ex) {
            String stb="Cập nhập dữ liệu không thành công.";
            JOptionPane.showMessageDialog(null,stb);       
        }
    }
    
    public void btn_delClick(ActionEvent event)
    {
         try {
            
            SACH sach_selected = (SACH)table_Sach.getSelectionModel().getSelectedItem();
            
            sach_model.Delete_Sach(sach_selected.getMasach());
            
            JOptionPane.showMessageDialog(null,"Xóa thành công");
        } catch (HeadlessException ex) {
            String stb="Xóa dữ liệu không thành công.";
            JOptionPane.showMessageDialog(null,stb);       
        }
    }
    
    public void btn_searchClick(ActionEvent event) throws IOException
    {
        table_Sach.setItems(null);
        //list_tacgia.setItems(null);
        //list_theloai.setItems(null);
        
        Parent root_timsach = FXMLLoader.load(getClass().getResource("FX_TimKiem_Sach.fxml"));  
        Scene scene_sach = new Scene(root_timsach);
        Stage stage_sach = new Stage();
        stage_sach.setScene(scene_sach);
        stage_sach.showAndWait();
        
        
        table_Sach.setItems(SACH.data);
        //list_tacgia.setItems(THELOAI.theloai_items);
        //list_theloai.setItems(TACGIA.tacgia_items);
    }
   
    public void getText()
    {
        masachText = txtMaSach.getText();
        tensachText = txtTenSach.getText();
        soluongText = txtSoLuong.getText();
        dongiabanText = txtDonGia.getText();
        ComboBox_MaTg_Selected = Integer.parseInt(txtTacGia.getText());
        ComboBox_MaTl_Selected = Integer.parseInt(txtTheLoai.getText());
        
        if(file_browser_flag==0)
        {
           urlHinh= urlHinhSelected;
        }
        else
            urlHinh = "Image/" + temp;
        
    }

}